﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace DAplicaciones1
{
    public class Sistema
    {
       private static Sistema sistema;
       private List<Tiempo> tiempos;
       private List<Usuario> usuarios;
       private List<Componente> componentes;
       private List<Compra> compras;      
       private List<Item> items;
       private Usuario usuario_loguado;
       private OPersistente oPersistene;
       private Gift[] arrGifts;

      

      

       public OPersistente OPersistente
       {
           get { return oPersistene; }
           set { oPersistene = value; }
       }


        /* constructor */
       protected Sistema()
       {
           tiempos = new List<Tiempo>();
           usuarios = new List<Usuario>();
           compras = new List<Compra>();
           items = new List<Item>();
           arrGifts = new Gift[3];
           oPersistene = new OPersistente();
           
       }

       public void cargarListasBD()
       {
           cargarUsuariosBD();
           cargarGiftBD();
           cargarTiemposBD();
           cargarItemsBd();
       }

       public static Sistema GetSistema()
       {
           if (sistema == null)
               sistema = new Sistema();
           return sistema;
       }
        
        /* gets and sets */
       public Gift[] ArrGifts
       {
           get { return arrGifts; }
           set { arrGifts = value; }
       }
       public List<Compra> Compras
       {
           get { return compras; }
           set { compras = value; }
       }
       public Usuario Usuario_loguado
       {
           get { return usuario_loguado; }
           set { usuario_loguado = value; }
       }              
       public List<Tiempo> Tiempos
       {
           get { return tiempos; }
           set { tiempos = value; }
       }
       public List<Componente> Componentes
       {
           get { return componentes; }
           set { componentes = value; }
       }
       public List<Usuario> Usuarios
       {   get { return usuarios;  }
           set { usuarios = value; }
       }

       public List<Item> Items
       {
           get { return items; }
           set { items = value; }
       }
      
        /* metodos */
       public bool existeUsuario(string usr, string pwd)
       { 
         bool retorno = false;
         foreach (Usuario usuario in usuarios)
         {
             if ((usuario.Username.Equals(usr)) && (usuario.Password.Equals(pwd)))
                 retorno = true;
         }
         return retorno;
       }
       public Usuario retornaUsuario(string usr)
       {
           foreach (Usuario usuario in Usuarios)
           {
               if (usuario.Username.Equals(usr))
                   return usuario;
           }
           return null;
       }

        public void cargarUsuariosBD()
        {
               usuarios.Clear();
               Usuario us = new Usuario();
               foreach (var usuario in us.traerLista())
               {
                   usuarios.Add((Usuario)usuario);
               }
        }


        public void cargarItemsBd()
        {
            Items.Clear();
            Libro l = new Libro();
            foreach (var libro in l.traerLista())
            {
                Items.Add((Libro)libro);
            }
            Cd c = new Cd();
            foreach (var cd in c.traerLista())
            {
                Items.Add((Cd)cd);
            }
            Magazine mz = new Magazine();
            foreach (var maga in mz.traerLista())
            {
                Items.Add((Magazine)maga);
            }
            Dvd d = new Dvd();
            foreach (var dvd in d.traerLista())
            {
                Items.Add((Dvd)dvd);
            }
        }


        public void cargarTiemposBD()
        {
            tiempos.Clear();
            Tiempo ts = new Tiempo();
            foreach (var tiempo in ts.traerLista())
            {
                tiempos.Add((Tiempo)tiempo);
            }
        }

        public void cargarGiftBD()
        {
            arrGifts= new Gift[3];
            Gift gift = new Gift();
            int i=0;
            foreach (var giftVar in gift.traerLista())
            {
                arrGifts[i]=(Gift)giftVar;
                i = i + 1;
            }
        }
       public bool eliminarUsuario(string usr)
       {
           bool eliminado;
           Usuario usuario = sistema.retornaUsuario(usr);
           if (usuarios.Contains(usuario)){
               usuario.eliminarse();
               usuarios.Remove(usuario);
               eliminado=true;
           }
           else
               eliminado=false;

           return eliminado;
          
       }
       public bool usernameValido(string username)
       {
           bool retorno = true;
           if (esVacio(username))
           {
               throw new System.ArgumentException("El usuario no puede ser vacio");
           }
           else
           {
               foreach (Usuario usuario in usuarios)
               {
                   if (usuario.Username.Equals(username))
                       throw new System.ArgumentException("El usuario ya esta en uso");
               }
           }
           return retorno;
       }
       public bool crearUsuario(string usr, string pwd, string nombre, string cedula)
       {

           int  cedula_valida;
           if (!nombre.Trim().Equals(""))
           {
               if (int.TryParse(cedula, out cedula_valida) && cedula.Length==8)
               {
                   if (usernameValido(usr))
                   {
                       if (!pwd.Trim().Equals(""))
                       {
                           Usuario usuario = new Usuario(usr, pwd, cedula_valida.ToString(), nombre);
                           usuario.agregarse();
                           usuarios.Add(usuario);
                           return true;
                       }
                       else
                           throw new System.ArgumentException("La password no puede ser vacia");
                   }
                   else
                       return false;
               }
               else
                   throw new System.ArgumentException("La cédula debe contener 8 digitos, sin puntos ni guiones");
           }
           else
               throw new System.ArgumentException("El nombre no puede ser vacio");
         
       }
       private bool esVacio(string var){
           bool esVacio;
           if (var.Trim().Equals("") | var.Length==0){
               esVacio = true;
           }
           else
               esVacio = false;
           
           return esVacio;
       }
       public Item crearLibro(string nombre, string precio, string costo, string isbn, string autor)
       {
           double precio_double;
           double costo_double;
           if (!(esVacio(nombre))) // paso nombre distinto de vacio
           {
               if (!(esVacio(costo))) // paso costo  distinto de vacio
               {
                   if (double.TryParse(costo, out costo_double))
                   {
                       if (!esVacio(precio)) // paso precio distinto de vacio
                       {
                           if (double.TryParse(precio, out precio_double))
                           {

                               if (!(esVacio(isbn))) // paso nombre distinto de vacio
                               {
                                   if (!(esVacio(autor))) // paso autor distinto de vacio
                                   {
                                       Libro libro = new Libro(nombre, precio_double,costo_double,isbn, autor);
                                       TiempoEntrega t = new TiempoEntrega();
                                       libro.Agregados.Add(t);
                                       libro.agregarse();
                                       items.Add(libro);
                                       return libro; // creo el item :)
                                   }
                                   else
                                       throw new System.ArgumentException("El autor del libro no puede ser vacio");
                               }
                               else
                                   throw new System.ArgumentException("El isbn del libro no puede ser vacio");
                           }
                           else
                               throw new System.ArgumentException("Precio invalido ");
                       }
                       else
                           throw new System.ArgumentException("El precio del libro no puede ser vacio");
                   }
                   else
                       throw new System.ArgumentException("Costo invalido");
               }
               else
                   throw new System.ArgumentException("El costo del libro no puede ser vacio");
           }
           else
               throw new System.ArgumentException("El nombre del libro no puede ser vacio");                     
       }
       public Item crearCD(string nombre, string precio, string costo, string artista, string cantCanciones)
       {
           double precio_double;
           double costo_double;
           int cantidad_canciones;
           if (!(esVacio(nombre))) // paso nombre distinto de vacio
           {
               if (!(esVacio(costo))) // paso costo  distinto de vacio
               {
                   if (double.TryParse(costo, out costo_double))
                   {
                       if (!(esVacio(precio))) // paso precio distinto de vacio
                       {
                           if (double.TryParse(precio, out precio_double))
                           {

                               if (!(esVacio(artista))) // paso artista distinto de vacio
                               {
                                   if (!(cantCanciones.Trim().Equals(""))) // paso artista distinto de vacio
                                   {
                                       if (int.TryParse(cantCanciones, out cantidad_canciones))
                                       {
                                           Cd cd = new Cd(nombre, precio_double, costo_double, artista, cantidad_canciones);
                                           TiempoEntrega t = new TiempoEntrega();
                                           cd.Agregados.Add(t);
                                           cd.agregarse();
                                           items.Add(cd);
                                           return cd; // creo el item :)
                                       }
                                       else
                                           throw new System.ArgumentException("Cantidad de Canciones invalido");
                                   }
                                   else
                                       throw new System.ArgumentException("La cantidad de canciones no puede ser vacio");
                               }
                               else
                                   throw new System.ArgumentException("El artista del cd no puede ser vacio");
                           }
                           else
                               throw new System.ArgumentException("Precio invalido ");
                       }
                       else
                           throw new System.ArgumentException("El precio del cd no puede ser vacio");
                   }
                   else
                       throw new System.ArgumentException("Costo invalido");
               }
               else
                   throw new System.ArgumentException("El costo del cd no puede ser vacio");
           }
           else
               throw new System.ArgumentException("El nombre del cd no puede ser vacio");          
       }
       public Item crearDvd(string nombre, string precio, string costo, string artista, string duracion)
       {
           double precio_double;
           double costo_double;
           double duracion_double;
           if (!(esVacio(nombre))) // paso nombre distinto de vacio
           {
               if (!(esVacio(costo))) // paso costo  distinto de vacio
               {
                   if (double.TryParse(costo, out costo_double))
                   {
                       if (!(esVacio(precio))) // paso precio distinto de vacio
                       {
                           if (double.TryParse(precio, out precio_double))
                           {
                               if (!(esVacio(artista))) // paso artista distinto de vacio
                               {
                                   if (!(esVacio(duracion))) // paso artista distinto de vacio
                                   {
                                       if (double.TryParse(duracion, out duracion_double))
                                       {
                                           Dvd dvd = new Dvd(nombre, precio_double, costo_double, artista, duracion_double);
                                           TiempoEntrega t = new TiempoEntrega();
                                           dvd.Agregados.Add(t);
                                           dvd.agregarse();
                                           items.Add(dvd);
                                           return dvd; // creo el item :)
                                       }
                                       else
                                           throw new System.ArgumentException("Duracion del dvd invalida");
                                   }
                                   else
                                       throw new System.ArgumentException("La Duracion del dvd no puede ser vacia");
                               }
                               else
                                   throw new System.ArgumentException("El artista del dvd no puede ser vacio");
                           }
                           else
                               throw new System.ArgumentException("Precio invalido ");
                       }
                       else
                           throw new System.ArgumentException("El precio del dvd no puede ser vacio");
                   }
                   else
                       throw new System.ArgumentException("Costo invalido");
               }
               else
                   throw new System.ArgumentException("El costo del dvd no puede ser vacio");
           }
           else
               throw new System.ArgumentException("El nombre del dvd no puede ser vacio");
       }


       public Item crearMagazine(string nombre, string precio, string costo,string codigo, string nroEdicion, string cantPaginas)
       {
           int codigo_integer;
           int nroEdicion_integer;
           int cantPaginas_integer;
           double precio_double;
           double costo_double;
           if (!(esVacio(nombre))) // paso nombre distinto de vacio
           {
               if (!(esVacio(costo))) // paso costo  distinto de vacio
               {
                   if (double.TryParse(costo, out costo_double))
                   {
                       if (!(esVacio(precio))) // paso precio distinto de vacio
                       {
                           if (double.TryParse(precio, out precio_double))
                           {
                               if (!(esVacio(codigo))) // paso codigo distinto de vacio
                               {
                                   if (int.TryParse(codigo, out codigo_integer))
                                   {
                                       if (!(esVacio(nroEdicion))) // paso nro de edición distinto de vacio
                                       {
                                           if (int.TryParse(nroEdicion, out nroEdicion_integer))
                                           {
                                               if (!(esVacio(cantPaginas))) // paso cantidad de páginas distinto de vacio
                                               {
                                                   if (int.TryParse(cantPaginas, out cantPaginas_integer))
                                                   {
                                                       Magazine mag = new Magazine(nombre, codigo_integer, nroEdicion_integer, cantPaginas_integer, precio_double, costo_double);
                                                       TiempoEntrega t = new TiempoEntrega();
                                                       mag.Agregados.Add(t);
                                                       mag.agregarse();
                                                       items.Add(mag);
                                                       return mag; // creo el item :)
                                                   }
                                                   else
                                                       throw new System.ArgumentException("La cantidad de páginas es invalida");
                                               }
                                               else
                                                   throw new System.ArgumentException("La cantidad de páginas de magazine no puede ser vacia");
                                           }
                                           else
                                               throw new System.ArgumentException("Número de edición de magazine invalida");
                                       }
                                       else
                                           throw new System.ArgumentException("El número de edición de magazine no puede ser vacia");
                                   }else
                                       throw new System.ArgumentException("Código de magazine invalido");
                               }
                               else
                                   throw new System.ArgumentException("El código de magazine no puede ser vacio");
                           }
                           else
                               throw new System.ArgumentException("Precio invalido ");
                       }
                       else
                           throw new System.ArgumentException("El precio de Magazine no puede ser vacio");
                   }
                   else
                       throw new System.ArgumentException("Costo invalido");
               }
               else
                   throw new System.ArgumentException("El costo de magazine no puede ser vacio");
           }
           else
               throw new System.ArgumentException("El nombre del magazine no puede ser vacio");
       }



       public bool crearCompra(Usuario usuario, Componente componente)
       {
           try
           {
               Compra compra = new Compra();
               compra.Usuario = usuario;
               compra.Fecha = DateTime.Now;
               compra.Componente = componente;
               sistema.Compras.Add(compra);
               return true;
           }
           catch(Exception ){
               throw new System.ArgumentException("Falló al crearse la compra");
           }
       }
       public bool crearAgregados(Item item, string accOnline, string contRelacionado)
       {
           double accesoOnline;
           double contenidoRelacionado;

           if (!(esVacio(accOnline))) 
           {
               if (double.TryParse(accOnline, out accesoOnline))
               {
                   if (!(esVacio(contRelacionado)))
                   {
                       if (double.TryParse(contRelacionado, out contenidoRelacionado))
                       {
                           AccesoOnline acc = new AccesoOnline(accesoOnline);
                           ContenidoRelacionado crel = new ContenidoRelacionado(contenidoRelacionado);
                           TiempoEntrega tentrega = new TiempoEntrega();
                           crel.OID = item.OID;
                           acc.OID = item.OID;
                           acc.agregarse();
                           crel.agregarse();
                           item.Agregados.Add(acc);
                           item.Agregados.Add(crel);
                           item.Agregados.Add(tentrega);
                           return true;
                       }
                       else
                           throw new System.ArgumentException("Valor de acceso online invalido");
                   }
                   else
                       throw new System.ArgumentException("Contenido relacionado no puede ser vacio");
               }
               else
                   throw new System.ArgumentException("Valor de acceso online invalido");
           }
           else
               throw new System.ArgumentException("Acceso online no puede ser vacio");
       }
       public bool existeTiempoEntrega(int dias) 
       {           
           foreach (Tiempo tiempo in tiempos)
           {
               if (tiempo.Dias == dias)
                   return true;
           }
           return false;
       }
       public Tiempo retornarTiempoEntrega(int dias)
       {
           foreach (Tiempo tiempo in tiempos)
           {
               if (tiempo.Dias == dias)
                   return tiempo;
           }
           return null;
       }
       public bool eliminarTiempoEntrega(int dias)
       {
           foreach (Tiempo tiempo in tiempos)
           {
               if (tiempo.Dias == dias)
               {
                   tiempo.eliminarse();
                   tiempos.Remove(tiempo);
                   return true;
               }
           }
           return false;
       }
       public bool crearTiempoEntrega(string dias, string precio)
       {
           int cant_dias;
           double precio_double;

           if (!(esVacio(dias)))
           {
               if (int.TryParse(dias, out cant_dias))
               {
                   if (!(esVacio(precio)))
                   {
                       if (double.TryParse(precio, out precio_double))
                       {
                           if (!existeTiempoEntrega(cant_dias))
                           {
                               Tiempo tiempo = new Tiempo(cant_dias, precio_double);
                               tiempo.agregarse();
                               tiempos.Add(tiempo);
                               return true;
                           }
                           else
                               throw new System.ArgumentException("Ya existe un precio de entrega para el dia elegido");
                       }
                       else
                           throw new System.ArgumentException("Precio invalido");
                   }
                   else
                       throw new System.ArgumentException("El precio no puede ser vacio");
               }
               else
                   throw new System.ArgumentException("Valor de dias invalida");
           }
           else
               throw new System.ArgumentException("La cantidad de dias no puede ser vacio");
       }
       public bool modificarTiempoEntrega(string dias, string precio)
       {
           int cant_dias;
           double precio_double;

           if (!(esVacio(dias)))
           {
               if (int.TryParse(dias, out cant_dias))
               {
                   if (!(esVacio(precio)))
                   {
                       if (double.TryParse(precio, out precio_double))
                       {
                           if (existeTiempoEntrega(cant_dias))
                           {
                               Tiempo tiempo = retornarTiempoEntrega(cant_dias);
                               tiempo.Dias = cant_dias;
                               tiempo.Precio = precio_double;
                               tiempo.modificarse();
                               return true;
                           }
                           else
                               throw new System.ArgumentException("No se encontro el tiempo de entrega a modificar");
                       }
                       else
                           throw new System.ArgumentException("Precio invalido");
                   }
                   else
                       throw new System.ArgumentException("El precio no puede ser vacio");
               }
               else
                   throw new System.ArgumentException("Valor de dias invalida");
           }
           else
               throw new System.ArgumentException("La cantidad de dias no puede ser vacio");
       }
       public double calcularVentasPeriodo(DateTime desde, DateTime hasta)
       {
           double subtotal = 0;
                   foreach (Compra compra in compras)
                   {
                       bool condicion1 = (DateTime.Compare(desde.Date, compra.Fecha.Date) <= 0);
                       bool condicion2 = (DateTime.Compare(hasta.Date, compra.Fecha.Date) >= 0);
                       if ( condicion1 && condicion2 )
                           subtotal += compra.Componente.calcularCosto();
                   }
           return subtotal;
       }      
       public double calcularVentasTotal()
       {
           double subtotal = 0;
           foreach (Compra compra in compras)
           {
               subtotal += compra.Componente.calcularCosto();
           }
           return subtotal;
       }
       public Item retornaItem(string nombre)
       {
           foreach (Item item in this.Items)
           {
               if (item.Nombre.Equals(nombre))
                   return item.Copia();
           }
           return null;
       }

       public Agregado retornaAgregadoParaItem(string nombreItem,Type tipoAgregado)
       {
           foreach (Item item in this.Items)
           {
               if (item.Nombre.Equals(nombreItem))
               {
                   foreach (Agregado agregado in item.Agregados)
                   {
                       if (agregado.GetType() == tipoAgregado)
                           return agregado.Copia();  
                   }
               }
                  
           }
           return null;
       }

       public Agregado retornaAgregadoGiftParaItem(string nombreItem,Type tipoAgregado)
       {
           foreach (Gift gift in this.arrGifts)
           {
               if (gift.Item ==null)
               {
                   if (gift.Descripcion.Equals(nombreItem))
                   {
                       return gift.Copia();
                   }
               }
               else 
               {
                   if (gift.Item.Nombre.Equals(nombreItem))
                   {
                       return gift.Copia();
                   }
               }
                  
           }
           return null;
       }


       public bool insertarRangosGift(string Desde1, string Hasta1, string Precio1, Item item1, string Descripcion1, string Desde2, string Hasta2, string Precio2, Item item2, string Descripcion2, string Desde3, string Hasta3, string Precio3, Item item3, string Descripcion3)
       {
           double Desde1_converted;
           double Hasta1_converted;
           double Precio1_converted;
           double Desde2_converted;
           double Hasta2_converted;
           double Precio2_converted;
           double Desde3_converted;
           double Hasta3_converted;
           double Precio3_converted;
           bool modificar = false;
           if (double.TryParse(Desde1, out Desde1_converted))
           { 
               if (double.TryParse(Hasta1, out Hasta1_converted))
               {
                   if (double.TryParse(Precio1, out Precio1_converted))
                    {
                          if ((item1 != null) || (!Descripcion1.Trim().Equals("")))
                          {                              
                              if (double.TryParse(Desde2, out Desde2_converted))
                              { 
                                if (double.TryParse(Hasta2, out Hasta2_converted))
                                {
                                    if (double.TryParse(Precio2, out Precio2_converted))
                                    {
                                        if ((item2 != null) || (!Descripcion2.Trim().Equals("")))
                                        {
                                            if (double.TryParse(Desde3, out Desde3_converted))
                                            {
                                                if (double.TryParse(Hasta3, out Hasta3_converted))
                                                {
                                                    if (double.TryParse(Precio3, out Precio3_converted))
                                                    {
                                                        if ((item3 != null) || (!Descripcion3.Trim().Equals("")))
                                                        {
                                                            if (Desde1_converted <= Hasta1_converted)
                                                            {
                                                                if ((Hasta1_converted+1) ==  Desde2_converted) // verifica que el comienzo del segundo sea el fin del primero +1
                                                                {
                                                                    if (Desde2_converted <= Hasta2_converted)
                                                                    {
                                                                        if ((Hasta2_converted+1) == Desde3_converted)// verifica que el comienzo del segundo sea el fin del primero +1
                                                                        {
                                                                            if (Desde3_converted <= Hasta3_converted)
                                                                            {
                                                                               
                                                                               Gift gift_1;
                                                                               if (item1 != null)
                                                                                   gift_1 = new Gift(Precio1_converted, item1, Desde1_converted, Hasta1_converted);
                                                                               else
                                                                                   gift_1 = new Gift(Precio1_converted, Descripcion1, Desde1_converted, Hasta1_converted);

                                                                               gift_1.agregarse();
                                                                             
                                                                               arrGifts[0] = gift_1;


                                                                               Gift gift_2;
                                                                               if (item2 != null)
                                                                                   gift_2 = new Gift(Precio2_converted, item2, Desde2_converted, Hasta2_converted);
                                                                               else
                                                                                   gift_2 = new Gift(Precio2_converted, Descripcion2, Desde2_converted, Hasta2_converted);
                                                                               
                                                                               gift_2.agregarse();
                                                                               arrGifts[1] = gift_2;


                                                                               Gift gift_3;
                                                                               if (item3 != null)
                                                                                   gift_3 = new Gift(Precio3_converted, item3, Desde3_converted, Hasta3_converted);
                                                                               else
                                                                                   gift_3 = new Gift(Precio3_converted, Descripcion3, Desde3_converted, Hasta3_converted);
                                                                               
                                                                                gift_3.agregarse();
                                                                                arrGifts[2] = gift_3;
                                                                                return true;
                                                                            }
                                                                            else
                                                                                throw new System.ArgumentException("El valor \"Hasta\" de rango 3 debe ser mayor que el valor del campo \"Desde\"");
                                                                        }
                                                                        else
                                                                            throw new System.ArgumentException("El valor \"Desde\" de rango 3 debe ser igual al valor \"Hasta\" de rango 2 mas uno");
                                                                    }
                                                                    else
                                                                        throw new System.ArgumentException("El valor \"Hasta\" de rango 2 debe ser mayor que el valor del campo \"Desde\"");
                                                                }
                                                                else
                                                                    throw new System.ArgumentException(" El valor \"Desde\" de rango 2 debe ser igual al valor \"Hasta\" de rango 1 mas uno");
                                                            }
                                                            else
                                                                throw new System.ArgumentException("El valor \"Hasta\" de rango 1 debe ser mayor que el valor del campo \"Desde\"");
                                                        }
                                                        else
                                                            throw new System.ArgumentException("Item de rango invalido");
                                                    }
                                                    else
                                                        throw new System.ArgumentException("Valor Precio de rango 3 invalido");
                                                }
                                                else
                                                    throw new System.ArgumentException("Valor Hasta de rango 3 invalido");
                                            }
                                            else
                                                throw new System.ArgumentException("Valor Desde de rango 3 invalido");
                                        }
                                       else
                                            throw new System.ArgumentException("Item de rango 2 invalido");
                                    }
                                   else
                                    throw new System.ArgumentException("Valor Precio de rango 2 invalido");
                                }
                                else
                                 throw new System.ArgumentException("Valor Hasta de rango 2 invalido");
                              }
                               else
                                throw new System.ArgumentException("Valor Desde de rango 2 invalido");
                          }
                           else
                            throw new System.ArgumentException("Item de rango 1 invalido");
                    }
                   else
                    throw new System.ArgumentException("Valor Precio de rango 1 invalido");
               }
               else
                throw new System.ArgumentException("Valor Hasta de rango 1 invalido");
           }
           else
            throw new System.ArgumentException("Valor Desde de rango 1 invalido");
           return false;
       }

       public bool modificarRangosGift(string Desde1, string Hasta1, string Precio1, Item item1, string Descripcion1, string Desde2, string Hasta2, string Precio2, Item item2, string Descripcion2, string Desde3, string Hasta3, string Precio3, Item item3, string Descripcion3)
       {
           double Desde1_converted;
           double Hasta1_converted;
           double Precio1_converted;
           double Desde2_converted;
           double Hasta2_converted;
           double Precio2_converted;
           double Desde3_converted;
           double Hasta3_converted;
           double Precio3_converted;
           bool modificar = false;
           if (double.TryParse(Desde1, out Desde1_converted))
           {
               if (double.TryParse(Hasta1, out Hasta1_converted))
               {
                   if (double.TryParse(Precio1, out Precio1_converted))
                   {
                       if ((item1 != null) || (!Descripcion1.Trim().Equals("")))
                       {
                           if (double.TryParse(Desde2, out Desde2_converted))
                           {
                               if (double.TryParse(Hasta2, out Hasta2_converted))
                               {
                                   if (double.TryParse(Precio2, out Precio2_converted))
                                   {
                                       if ((item2 != null) || (!Descripcion2.Trim().Equals("")))
                                       {
                                           if (double.TryParse(Desde3, out Desde3_converted))
                                           {
                                               if (double.TryParse(Hasta3, out Hasta3_converted))
                                               {
                                                   if (double.TryParse(Precio3, out Precio3_converted))
                                                   {
                                                       if ((item3 != null) || (!Descripcion3.Trim().Equals("")))
                                                       {
                                                           if (Desde1_converted <= Hasta1_converted)
                                                           {
                                                               if ((Hasta1_converted + 1) == Desde2_converted) // verifica que el comienzo del segundo sea el fin del primero +1
                                                               {
                                                                   if (Desde2_converted <= Hasta2_converted)
                                                                   {
                                                                       if ((Hasta2_converted + 1) == Desde3_converted)// verifica que el comienzo del segundo sea el fin del primero +1
                                                                       {
                                                                           if (Desde3_converted <= Hasta3_converted)
                                                                           {
                                                                               
                                                                               Gift gift_1;
                                                                               if (item1 != null)
                                                                               {
                                                                                   gift_1 = arrGifts[0];
                                                                                   gift_1.precio=Precio1_converted;
                                                                                   gift_1.Item=item1;
                                                                                   gift_1.RangoBase=Desde1_converted; 
                                                                                   gift_1.RangoTope=Hasta1_converted;
                                                                               }
                                                                               else
                                                                               {
                                                                                   gift_1 = arrGifts[0];
                                                                                   gift_1.Item = null;
                                                                                   gift_1.precio=Precio1_converted;
                                                                                   gift_1.Descripcion=Descripcion1;
                                                                                   gift_1.RangoBase=Desde1_converted; 
                                                                                   gift_1.RangoTope=Hasta1_converted;
                                                                               }

                                                                               gift_1.modificarse();

                                                                               arrGifts[0] = gift_1;


                                                                               Gift gift_2;
                                                                               if (item2 != null)
                                                                               {
                                                                                   gift_2 = arrGifts[1];
                                                                                   gift_2.precio = Precio2_converted;
                                                                                   gift_2.Item = item2;
                                                                                   gift_2.RangoBase = Desde2_converted;
                                                                                   gift_2.RangoTope = Hasta2_converted;
                                                                               }
                                                                               else
                                                                               {
                                                                                   gift_2 = arrGifts[1];
                                                                                   gift_2.Item = null;
                                                                                   gift_2.precio = Precio2_converted;
                                                                                   gift_2.Descripcion = Descripcion1;
                                                                                   gift_2.RangoBase = Desde2_converted;
                                                                                   gift_2.RangoTope = Hasta2_converted;
                                                                               }
                                                                               gift_2.modificarse();
                     
                                                                               arrGifts[1] = gift_2;


                                                                               Gift gift_3;
                                                                               if (item3 != null)
                                                                               {
                                                                                   gift_3 = arrGifts[2];
                                                                                   gift_3.precio = Precio3_converted;
                                                                                   gift_3.Item = item3;
                                                                                   gift_3.RangoBase = Desde3_converted;
                                                                                   gift_3.RangoTope = Hasta3_converted;
                                                                               }
                                                                               else
                                                                               {
                                                                                   gift_3 = arrGifts[2];
                                                                                   gift_3.Item = null;
                                                                                   gift_3.precio = Precio3_converted;
                                                                                   gift_3.Descripcion = Descripcion3;
                                                                                   gift_3.RangoBase = Desde3_converted;
                                                                                   gift_3.RangoTope = Hasta3_converted;
                                                                               }

                                                                               gift_3.modificarse();
                                                                               arrGifts[2] = gift_3;
                                                                               return true;
                                                                           }
                                                                           else
                                                                               throw new System.ArgumentException("El valor \"Hasta\" de rango 3 debe ser mayor que el valor del campo \"Desde\"");
                                                                       }
                                                                       else
                                                                           throw new System.ArgumentException("El valor \"Desde\" de rango 3 debe ser igual al valor \"Hasta\" de rango 2 mas uno");
                                                                   }
                                                                   else
                                                                       throw new System.ArgumentException("El valor \"Hasta\" de rango 2 debe ser mayor que el valor del campo \"Desde\"");
                                                               }
                                                               else
                                                                   throw new System.ArgumentException(" El valor \"Desde\" de rango 2 debe ser igual al valor \"Hasta\" de rango 1 mas uno");
                                                           }
                                                           else
                                                               throw new System.ArgumentException("El valor \"Hasta\" de rango 1 debe ser mayor que el valor del campo \"Desde\"");
                                                       }
                                                       else
                                                           throw new System.ArgumentException("Item de rango invalido");
                                                   }
                                                   else
                                                       throw new System.ArgumentException("Valor Precio de rango 3 invalido");
                                               }
                                               else
                                                   throw new System.ArgumentException("Valor Hasta de rango 3 invalido");
                                           }
                                           else
                                               throw new System.ArgumentException("Valor Desde de rango 3 invalido");
                                       }
                                       else
                                           throw new System.ArgumentException("Item de rango 2 invalido");
                                   }
                                   else
                                       throw new System.ArgumentException("Valor Precio de rango 2 invalido");
                               }
                               else
                                   throw new System.ArgumentException("Valor Hasta de rango 2 invalido");
                           }
                           else
                               throw new System.ArgumentException("Valor Desde de rango 2 invalido");
                       }
                       else
                           throw new System.ArgumentException("Item de rango 1 invalido");
                   }
                   else
                       throw new System.ArgumentException("Valor Precio de rango 1 invalido");
               }
               else
                   throw new System.ArgumentException("Valor Hasta de rango 1 invalido");
           }
           else
               throw new System.ArgumentException("Valor Desde de rango 1 invalido");
           return false;
       }


    }
}
